/*********************************************************************
 * Copyright (C) 2003 Andrew Khan
 * <p>
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * <p>
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * <p>
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ***************************************************************************/

package jxl.biff.drawing;

import jxl.biff.IntegerHelper;
import jxl.common.Logger;

/**
 * The client anchor record
 */
class ClientAnchor extends EscherAtom {
    /**
     * The logger
     */
    private static final Logger logger = Logger.getLogger(ClientAnchor.class);

    /**
     * The binary data
     */
    private byte[] data;

    /**
     * The properties
     */
    private int properties;

    /**
     * The x1 position
     */
    private double x1;

    /**
     * The y1 position
     */
    private double y1;

    /**
     * The x2 position
     */
    private double x2;

    /**
     * The y2 position
     */
    private double y2;

    /**
     * Constructor
     *
     * @param erd the escher record data
     */
    public ClientAnchor(EscherRecordData erd) {
        super(erd);
        byte[] bytes = getBytes();

        // The properties
        properties = IntegerHelper.getInt(bytes[0], bytes[1]);

        // The x1 cell
        int x1Cell = IntegerHelper.getInt(bytes[2], bytes[3]);
        int x1Fraction = IntegerHelper.getInt(bytes[4], bytes[5]);

        x1 = x1Cell + (double) x1Fraction / (double) 1024;

        // The y1 cell
        int y1Cell = IntegerHelper.getInt(bytes[6], bytes[7]);
        int y1Fraction = IntegerHelper.getInt(bytes[8], bytes[9]);

        y1 = y1Cell + (double) y1Fraction / (double) 256;

        // The x2 cell
        int x2Cell = IntegerHelper.getInt(bytes[10], bytes[11]);
        int x2Fraction = IntegerHelper.getInt(bytes[12], bytes[13]);

        x2 = x2Cell + (double) x2Fraction / (double) 1024;

        // The y1 cell
        int y2Cell = IntegerHelper.getInt(bytes[14], bytes[15]);
        int y2Fraction = IntegerHelper.getInt(bytes[16], bytes[17]);

        y2 = y2Cell + (double) y2Fraction / (double) 256;
    }

    /**
     * Constructor
     *
     * @param x1 the x1 position
     * @param y1 the y1 position
     * @param x2 the x2 position
     * @param y2 the y2 position
     * @param props the anchor properties
     */
    public ClientAnchor(double x1, double y1, double x2, double y2, int props) {
        super(EscherRecordType.CLIENT_ANCHOR);
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        properties = props;
    }

    /**
     * Gets the client anchor data
     *
     * @return the data
     */
    byte[] getData() {
        data = new byte[18];
        IntegerHelper.getTwoBytes(properties, data, 0);

        // The x1 cell
        IntegerHelper.getTwoBytes((int) x1, data, 2);

        // The x1 fraction into the cell 0-1024
        int x1fraction = (int) ((x1 - (int) x1) * 1024);
        IntegerHelper.getTwoBytes(x1fraction, data, 4);

        // The y1 cell
        IntegerHelper.getTwoBytes((int) y1, data, 6);

        // The y1 fraction into the cell 0-256
        int y1fraction = (int) ((y1 - (int) y1) * 256);
        IntegerHelper.getTwoBytes(y1fraction, data, 8);

        // The x2 cell
        IntegerHelper.getTwoBytes((int) x2, data, 10);

        // The x2 fraction into the cell 0-1024
        int x2fraction = (int) ((x2 - (int) x2) * 1024);
        IntegerHelper.getTwoBytes(x2fraction, data, 12);

        // The y2 cell
        IntegerHelper.getTwoBytes((int) y2, data, 14);

        // The y2 fraction into the cell 0-256
        int y2fraction = (int) ((y2 - (int) y2) * 256);
        IntegerHelper.getTwoBytes(y2fraction, data, 16);

        return setHeaderData(data);
    }

    /**
     * Accessor for the x1 position
     *
     * @return the x1 position
     */
    double getX1() {
        return x1;
    }

    /**
     * Accessor for the y1 position
     *
     * @return the y1 position
     */
    double getY1() {
        return y1;
    }

    /**
     * Accessor for the x2 position
     *
     * @return the x2 position
     */
    double getX2() {
        return x2;
    }

    /**
     * Accessor for the y2 position
     *
     * @return the y2 position
     */
    double getY2() {
        return y2;
    }

    /**
     * Accessor for the anchor properties
     */
    int getProperties() {
        return properties;
    }
}
